package validator

import (
	"strconv"
	"strings"
)

func NewStringValidator(tagItem string) Validator {
	var fch = tagItem[0]
	if tagItem[1] == '$' {
		// 正则表达式
		if tagItem[0] == '(' {
			// 不匹配
			return NewStringRegex(tagItem[2:len(tagItem)-2], false)
		}
		// 匹配
		return NewStringRegex(tagItem[2:len(tagItem)-2], true)
	}
	var lch = tagItem[len(tagItem)-1]
	content := tagItem[1 : len(tagItem)-1]
	items := strings.Split(content, ":")
	if len(items) == 1 {
		// 没有范围标志
		items := parseStringItems(content)
		return NewStringInValidator(items, fch != '[')
		// if fch == '[' {
		// 	return NewStringInValidator(items, false)
		// } else {
		// 	return NewNotInValidator(items, func(v reflect.Value) string { return v.String() })
		// }
	} else if len(items) == 2 {
		// 是范围标志
		var min *StringBorder
		if items[0] != "" {
			// 有最小值
			val, err := strconv.ParseInt(items[0], 10, 64)
			if err != nil {
				return nil
			}
			min = &StringBorder{Value: int(val), Include: fch == '['}
		}
		var max *StringBorder
		if items[1] != "" {
			// 有最大值
			val, err := strconv.ParseInt(items[1], 10, 64)
			if err != nil {
				return nil
			}
			max = &StringBorder{Value: int(val), Include: lch == ']'}
		}
		return NewStringRangeValidator(min, max)
	}

	return nil

	// return NewRangeValidator(nil, nil, func(v reflect.Value) int {
	// 	return utf8.RuneCountInString(v.String())
	// })
}

func parseStringItems(str string) []string {
	var items []string
	var inStr = false
	var last = ""
	for _, ch := range str {
		if ch == ',' {
			// 分隔符
			if !inStr {
				if last != "" {
					items = append(items, last)
					last = ""
				}
				continue
			}
		} else if ch == '\'' {
			if inStr {
				// 在单引号范围内
				// 退出单引号范围
				inStr = false
			} else {
				// 没有在单引号范围内
				if last == "" {
					// 进入字符串范围
					inStr = true
				}
			}
		}
		last += string(ch)
	}
	if last != "" {
		items = append(items, last)
	}
	return items
}
